<?php
//引入控制器核心；
include_once (BASE_PATH.'/ZeroPHP/core/ControllerCore.class.php');

//引入视图引擎；
include_once (BASE_PATH.'/ZeroPHP/core/ViewCore.class.php');
////载入初始化配置
define('IS_CACHE',false);//是否开启缓存
//引入DB模型核心；
include_once (BASE_PATH.'/ZeroPHP/core/DbCore.class.php');
include_once (BASE_PATH.'/ZeroPHP/core/ModelCore.class.php');

//引入公共函数库
include_once (BASE_PATH.'/ZeroPHP/core/CommonCore.class.php');

//引入Widget核心；
include_once (BASE_PATH.'/ZeroPHP/core/WidgetCore.class.php');

//引入日志核心；
include_once (BASE_PATH.'/ZeroPHP/core/LogCore.class.php');


/**
 * 总控类
 */
class ZeroPHP {
    /**
     * 模块
     * @var string
     */
    private $mod;
    /**
     * 控制器
     * @var string
     */
    private $c;
    /**
     * Action
     * @var string
     */
    private $a;
    /**
     * 单例
     * @var ZeroPHP
     */
    private static $_instance;

    /**
     * 构造函数，初始化配置
     * @param array $conf
     */
    private function __construct($conf){
        SysC($conf);
    }
    private function __clone(){}

    /**
     * 获取单例
     * @param array $conf
     * @return ZeroPHP
     */
    public static function getInstance($conf){
        if(!(self::$_instance instanceof self)){
            self::$_instance = new self($conf);
        }
        return self::$_instance;
    }
    /**
     * 运行应用实例
     * @access public
     * @return void
     */
    public function run(){
        $pathInfo = isset($_SERVER["REQUEST_URI"])?$_SERVER["REQUEST_URI"]:'';//赋值PATH_INFO
        $param = strstr($pathInfo,"?");
        $pathInfoArr = isset($param)?explode('?',trim($pathInfo,'/')):$param;
        spl_autoload_register(array('ZeroPHP', 'autoload'));//触发自动加载类
        //如果只有一个参数 则为模型控制器方法  两个则为带参数的模型控制器方法
        $is_mod = null;
        if(!strpos($pathInfoArr[0],'/')){
            foreach(sysC('publicMod') as $value){
                if(strcasecmp($pathInfoArr[0],$value) === 0){
                    $is_mod = 1;
                }
            }
            if(is_dir(APP_PATH.DS.$pathInfoArr[0]) && $is_mod===1){
                $this->mod = $pathInfoArr[0];
                $this->c = sysC('defaultC') ? sysC('defaultC') : 'index' ;
                $this->a = sysC('defaultA') ? sysC('defaultA') : 'index' ;
            }else{
                $this->mod = sysC('defaultMod') ? sysC('defaultMod') : 'home';
                $this->c = $pathInfoArr[0]!=='' ? $pathInfoArr[0] : 'index';
                $this->a = sysC('defaultA') ? sysC('defaultA') : 'index' ;
            }
        }else{
            $pathInfo=explode('/',$pathInfoArr[0]);

            foreach(sysC('publicMod') as $value){
                if(strcasecmp($pathInfo[0],$value) === 0){
                    $is_mod = 1;
                }
            }
            if(is_dir(APP_PATH.DS.$pathInfo[0]) && $is_mod===1){
                $this->mod = $pathInfo[0];
                $this->c = $pathInfo[1]!=='' ? $pathInfo[1] : 'index';
                $this->a = isset($pathInfo[2]) && $pathInfo[2]!=='' ? $pathInfo[2] : sysC('defaultA') ;
            }else{
                $this->mod = sysC('defaultMod') ? sysC('defaultMod') : 'home';
                $this->c = $pathInfo[0]!=='' ? $pathInfo[0] : 'index';
                $this->a = $pathInfo[1] ? $pathInfo[1] : 'index' ;
            }
        }

        if(count($pathInfoArr) == 2){//带有参数
            inGet($pathInfoArr[1]);
        }

        sysC(array('mod'=>$this->mod,'c'=>$this->c,'a'=>$this->a));//将模块控制器与方法传入超级变量；
        if(!file_exists(APP_PATH.DS.$this->mod)){halt('模块'.$this->mod.'不存在');header('location:/Public/Error/404.html');}
        if(!class_exists($this->c.'Controller')){//如果c的Controller类不存在，报错
            //判断c a 如果满足 模块名->控制器名目录和文件存在的条件 那么可能是模块未公开的原因。
            if(is_dir(APP_PATH.DS.sysC('c'))&&file_exists(APP_PATH.DS.sysC('c').DS.'Controller'.DS.sysC('a').'Controller.class.php'))
                halt('模块'.sysC('c').'不是公开的模块，或者控制器'.sysC('c').'不存在');
            halt('控制器'.$this->c.'不存在');header('location:/Public/Error/404.html');
        }
        $controllerClass = $this->c.'Controller';//赋值c的Controller类
        $controller = new $controllerClass();//实例化c的Controller类
        if(!method_exists($controller, $this->a)) {halt('方法'.$this->a.'不存在');header('location:/Public/Error/404.html');}//如果控制器的方法不存在 报错
        call_user_func(array($controller,$this->a));//回调函数使用$controller类的aAction的方法
    }

    /**
     * 自动加载函数
     * @param string $class 类名
     */
    public static function autoload($class){
        if(substr($class,-10)=='Controller'){//如果参数末尾10位=='Controller'
            includeIfExist(APP_PATH.DS.sysC('mod').'/Controller/'.$class.'.class.php');//引入应用目录下/Controller/参数.class.php;
        }elseif(substr($class,-5)=='Model'){
            includeIfExist(APP_PATH.DS.sysC('mod').'/Model/'.$class.'.class.php');//引入应用目录下/Model/参数.class.php;
        }elseif(substr($class,-6)=='Widget'){//如果参数末尾6位=='Widget'
            includeIfExist(APP_PATH.DS.sysC('mod').'/Widget/'.$class.'.class.php');//引入应用目录下/Widget/参数.class.php;
        }else{
            includeIfExist(BASE_PATH.'ZeroPHP/lib/'.$class.'.class.php');//引入框架目录下/Lib/参数.class.php;
        }
    }
}